跳到主要内容

MySQL 约束和级联操作

什么是约束及为什么要使用约束?

  • 约束实际上就是表中数据的限制条件
  • 表在设计的时候加上约束的目的是为了保证表中的记录完整和有效

常用约束

添加约束的时机

  • 创建表时
  • 修改表时

语法:

create table 表名(
字段名 字段类型 约束
)
  1. not null:非空,用于保证该字段的值不能为空
  2. default:设置默认值 字段名 varchar(255) default 默认值
  3. primary key:主键,唯一,用于保证该字段的值具有唯一性,并且非空
  4. unique:可以有多个,保证该字段具有唯一性(可以有一个 null)
  5. foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主键 foreign key(字段名) references 表2(字段名)
  6. check:约束 CHECK 约束用于限制列中的值的范围。CHECK 约束可以应用于一个或者多个列,也可以将多个CHECK 约束应用于一个列。

CHECK 约束

-- 下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

自增长列

又称为 标识列 可以不用手动的插入值,系统提供默认的序列值 就一个: auto_increment 关键字

Example

CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);

语法:

create table 表名(
id int 约束 auto_increment
);
  • 一个表只能有一个标识列
  • 标识列的类型只能是数值型

主键外键

CREATE TABLE Orders
(
字段名1 int NOT NULL,
字段名2 int NOT NULL UNIQUE,
字段名3 varchar(255) default 默认值,
字段名4 int,
PRIMARY KEY (字段名1),
FOREIGN KEY (字段名4) REFERENCES2(2的字段)
)

主键约束

主键约束(primary key 简称PK)

主键分类:

根据字段分:

  • 单一主键:给一个字段添加主键约束
  • 复合主键:给多个字段联合添加一个主键约束

无论是单一主键还是复合主键,一张表主键约束只能有一个。

根据性质分:

  • 自然主键:主键是一个自然数,这个自然数和当前表的业务没有任何关系
  • 业务主键:主键值和当前表中业务紧密相关,当业务数据发生改变时,主键值通常会受到影响,所以不建议使用。

例:

-- 单一主键:
-- 列级约束:
create table t_user(
id int(10) primary key,
name varchar(32)
);

-- 表级约束:(起名)
create table t_user(
id int(10),
name varchar(32),
-- 这个 constraint 关键字可以省略
constraint t_user_id_pk primary key(id)
);

-- 复合主键:(只能使用表级约束)
create table t_user(
id int(10),
name varchar(32),
email varchar(128),
primary key(id,name)
);

-- 也可以起名:
create table t_user(
id int(10),
name varchar(32),
email varchar(128),
constraint t_user_id_name_pk primary key(id,name)
);

外键约束

外键约束(foreign key 简称FK)

分类:

  • 单一外键:给一个字段添加外键约束
  • 复合外键:给多个字段联合添加一个外键约束

一张表中可以有多个外键字段

create table t_class(
cno int(3) primary key,
cname varchar(128) not null unique
);

create table t_student(
sno int(3) primary key,
sname varchar(32) not null,
classno int(3),
constraint t_student_classno_fk foreign key(classno) references t_class(cno)
);

级联更新与删除

在删除父表中的数据的时候,级联删除子表中的数据 on delete cascade; 在更新父表中的数据时候,级联更新子表中的数据 on update cascade;

-- 级联操作在外键约束后面添加

alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on delete cascade;


alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on update cascade;

级联操作要谨慎使用,因为级联操作会将数据改变或者删除